package com.qidian.buy.goods.config;

import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Author: 戴着假发的程序员
 * Date: 2024-05-15 11:47
 * company: 起点编程
 **/
//@Configuration
public class RabbitTemplateConfig {
//    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
        RabbitTemplate rabbitTemplate = new RabbitTemplate();
        //这里传入的connectionFactory 是springboot注入的对象
        rabbitTemplate.setConnectionFactory(connectionFactory);
        // 开启Mandatory, 才能触发回调函数，无论消息推送结果如何都强制调用回调函数
        rabbitTemplate.setMandatory(true);
        // 设置确认回调()  无论是否发送成功，这个回调都会执行
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            System.out.println("confirm回调");
            System.out.println("ConfirmCallback: "+"相关数据：" + correlationData);
            System.out.println("ConfirmCallback: "+"确认情况：" + ack); // 成功是true，失败是false
            System.out.println("ConfirmCallback: "+"原因：" + cause);
            // 我们在这里可以做一些业务逻辑，比如记录日志，记录发送失败的消息，进行补偿等
        });
        // 设置失败回调
        rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
            System.out.println("return回调");
            System.out.println("ReturnCallback: "+"消息：" + message);
            System.out.println("ReturnCallback: "+"回应码：" + replyCode);
            System.out.println("ReturnCallback: "+"回应信息：" + replyText);
            System.out.println("ReturnCallback: "+"交换机：" + exchange);
            System.out.println("ReturnCallback: "+"路由键：" + routingKey);
            // 我们在这里可以做一些业务逻辑，比如记录日志，记录发送失败的消息，进行补偿等
        });
        return rabbitTemplate;
    }
}
